# =============================================================================
# KLARGØR DANESPINE UDTRÆK (LÆNDERYG) – HOVEDSCRIPT
# 
# Formål: importer data, fjern '9' i EQ-5D-kolonner, fjern ugyldige datoer, 
# fjern test-indtastninger, generer beregnede kolonner: outcome delta, antal
# niveauer (i alt, 1 niv., 2 niv., mere end 2 niv.), return-to-work, 
# Sygemelding i dage og uger, BMI, forbedring af gangdistance. Scripted tilføjer
# en ny kolonne 'klinik' med mere mundrette afdelingsbetegnelser Disse kan
# ændres i mappingfilen 'mapning_klinik.xlsx' der ligger i mappen \\data\ekstern
# Forfatter: Casper Friis Bjerre 
# Organisation: Rygcenter Syddanmark, Rygkirurgisk Forskningsenhed, Kolding
# Input .csv data skal ligge i mappen \data\raw. Navngivning ligegyldig.
# Output data ligger i mappen \data\processed når scripted er færdigt.
# Dato: 30.09.2025
# =============================================================================

# --- 00) Pakker og kilder ----------------------------------------------------
suppressPackageStartupMessages({
  library(here)
  library(dplyr)
  library(readr)
  library(stringr)
  library(rio)
  library(tidyverse)
  library(janitor)
})

# Kildescripts/helpers (ligger i scripts/)
source(here::here("scripts", "import.R"))                 # Importer udtræk  
source(here::here("scripts", "fjern9_eq5d.R"))            # Fjern '9' fra EQ-5D
source(here::here("scripts", "rens_hoejde_vaegt.R"))      # Gyldig højde/vægt
source(here::here("scripts", "rens_dato.R"))              # Gyldig OP-dato
source(here::here("scripts", "beregn_bmi.R"))             # Beregn og oprens BMI
source(here::here("scripts", "beregn_deltas_fra_spec.R")) # Beregn deltaværdier
source(here::here("scripts", "return_to_work.R"))         # Return to work (0,1)
source(here::here("scripts", "mcid_gang.R"))              # MCID gangdistance (0,1)
source(here::here("scripts", "sygem_varighed.R"))         # Varighed af sygemelding
source(here::here("scripts", "niveauer.R"))               # Antal niveauer
source(here::here("scripts", "klinik_map.R"))             # Klinik mapping
source(here::here("scripts", "date_utils.R"))             # Dato parser

# --- 01) Importer data -------------------------------------------------------
df <- read_csv_robust(INPUT_FILE)

# --- 02) Gør kolonnenavne R-venlige ------------------------------------------
df <- janitor::clean_names(df)
df

# Strip tid (00:00:00) fra datoer
for (nm in c("bas_pre_syg_da", "aar1_opf_a1rask")) {
  s <- as.character(df[[nm]])
  s <- sub(" .*", "", s)                     # fjern " 00:00:00"
  df[[nm]] <- as.Date(s, format = "%d-%m-%Y")
}

# --- 04) Oprensning af data --------------------------------------------------
# Fjern 9-taller i EQ-5D kolonner
df <- remove9_eq5d(df) 

# Max/min for højde og vægt
df <- rens(df, bas_pre_hoej, bas_pre_vaegt) 

# Fjern cases med ugyldige datoer 
date_cols <- c("op_op_opdato", "bas_pre_syg_da",     
               "aar1_opf_a1rask", "aar2_opf_a2rask",
               "re_op_re_op_dato")
df <- rens_dato(df, date_cols)

# Fjern testindtastninger
ids <- c(101011320, 312331234, 505552222) 
df <- df[!(df$cp_rnr %in% ids), ]

# Erstatter manglende datoer med forløbsdatoen
df <- df %>%                         
  mutate(
    op_op_opdato = .parse_date(op_op_opdato),
    forlobsdato  = .parse_date(forlobsdato),
    op_op_opdato = coalesce(op_op_opdato, forlobsdato)  # udfyld NA med forlobsdato
  )

# --- 05) Dan beregnede kolonner ----------------------------------------------

# Generer BMI og behold gyldigt interval (12 - 50) 
df <- beregn_bmi(df) 

# Generer deltaværdier 
df <- beregn_deltas_fra_spec(df, spec_file = 
                               "data/ekstern/beskrivelse_beregnede_kolonner.xlsx") 

# Beregn return-to-work (0 = ja, 1 = nej)
df <- derive_rtw_simple(df) 
table(df$return_to_work, useNA = "ifany")

# Beregner forbedring i gangdistance år 1 (0 = ja, 1 = nej)
df <- derive_mcid_gang(df)  
table(df$mcid_gang, useNA = "ifany")

# Beregner varighed af sygemelding (dage, uger)
df <- sygem_varighed(df) 

# Beregner antal niveauer (i alt), 1 niv., 2 niv., mere end 2 niv.)
df <- niveau(df)
table(df$niveau, useNA = "ifany")
colSums(df[, c("niveau_1","niveau_2","niveau_mer")], na.rm = TRUE)

# --- 06) Klinik navne, mundrette ---------------------------------------------
df <- klinik(df, path = "data/ekstern/mapning_klinik.xlsx")

# --- 07) Omdøb variable ------------------------------------------------------
df <- df %>% rename(cpr_nr = cp_rnr)  # ny = gammel

# --- 08) Eksporter datasættet ------------------------------------------------
rio::export(df, here::here("data","processed","df.xlsx"))
